﻿using System;
using System.Collections.Generic;
using CruzDelSur.Dominio;
using NHibernate;
using NHibernate.Criterion;

namespace CruzDelSur.Persistencia
{
    public class TripulacionDAO : BaseDAO<Tripulacion, TripulacionCargoId>, ITripulacionDAO
    {
        public Cargo obtenerCargo(string codigo)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                IList<Cargo> resultado = sesion.CreateQuery("from Cargo where Codigo=:cod")
                    .SetParameter("cod", codigo)
                    .List<Cargo>();
                if (resultado.Count > 0)
                {
                    return resultado[0];
                }
                return null;
            }
        }

        public Empleado obtenerEmpleado(string codigo)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                IList<Empleado> resultado = sesion.CreateQuery("from Empleado where Codigo=:cod")
                    .SetParameter("cod", codigo)
                    .List<Empleado>();
                if (resultado.Count > 0)
                {
                    return resultado[0];
                }
                return null;
            }
        }
        public Tripulacion obtenerTripulacion(TripulacionCargoId codTripulacion)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                IList<Tripulacion> resultado = sesion
                    .CreateQuery("from Tripulacion where CodigoEmpleado=:codEmp and CodigoCargo=:codCar")
                    .SetParameter("codEmp", codTripulacion.CodigoEmpleado)
                    .SetParameter("codCar", codTripulacion.CodigoCargo)
                    .List<Tripulacion>();
                if (resultado.Count > 0)
                {
                    Tripulacion t = resultado[0];
                    t.Cargo = obtenerCargo(codTripulacion.CodigoCargo);
                    t.Empleado = obtenerEmpleado(codTripulacion.CodigoEmpleado);
                    return t;
                }
                return null;
            }
        }

        public void eliminarTripulacion(TripulacionCargoId codTripulacion)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                int r = sesion
                   .CreateQuery("delete from Tripulacion where CodigoEmpleado=:codEmp and CodigoCargo=:codCar")
                   .SetParameter("codEmp", codTripulacion.CodigoEmpleado)
                   .SetParameter("codCar", codTripulacion.CodigoCargo)
                   .ExecuteUpdate();
            }
        }

        public void cambiarEstadoTripulacion(string codEmp, string codCargo, string estado)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                int r = sesion
                   .CreateQuery("update from Tripulacion set Estado=:est where CodigoEmpleado=:codEmp and CodigoCargo=:codCar")
                   .SetParameter("codEmp", codEmp)
                   .SetParameter("codCar", codCargo)
                   .SetParameter("est", estado)
                   .ExecuteUpdate();
            }
        }

        public ICollection<Tripulacion> listadoTripulacion()
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion()){
                ICollection<Tripulacion> resultado = sesion.CreateQuery("from Tripulacion").List<Tripulacion>();
                foreach (Tripulacion t in resultado)
                {
                    t.Cargo = obtenerCargo(t.CodigoCargo);
                    t.Empleado = obtenerEmpleado(t.CodigoEmpleado);
                }
                return resultado;
            }
        }

        public ICollection<Cargo> listadoCargos()
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                ICollection<Cargo> resultado = sesion.CreateQuery("from Cargo").List<Cargo>();
                return resultado;
            }
        }

        public ICollection<Empleado> listadoEmpleados()
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                ICollection<Empleado> resultado = sesion.CreateQuery("from Empleado").List<Empleado>();
                return resultado;
            }
        }

        //Agregado por Victor
        public ICollection<Tripulacion> obtenerListadoPendientes()
        {
            ICollection<Tripulacion> resultado = this.Listar(
                DetachedCriteria.For<Tripulacion>().Add(
                    Restrictions.Eq("Estado", Tripulacion.PENDIENTE)
                   )
                );
            return resultado;
        }
    }
}